home *** CD-ROM | disk | FTP | other *** search
/ PC World Interactive 1 / PC World Interactive 1 - Nisan 1997.iso / nostalji / bbs / modem / sssw33ie.exe / SETUP.MST < prev    next >
Text File  |  1996-09-05  |  14KB  |  527 lines

  1. '**************************************************************************
  2. '* Install Script for SAPS Server 3.10
  3. '**************************************************************************
  4.  
  5. '$INCLUDE 'setupapi.inc'
  6. '$INCLUDE 'msdetect.inc'
  7.  
  8. CONST SW_SHOWMAXIMIZED=3
  9.  
  10.  
  11. ''Dialog ID's
  12. CONST WELCOME                   = 100
  13. CONST ASKQUIT                   = 200
  14. CONST DESTPATH                  = 300
  15. CONST EXITFAILURE               = 400
  16. CONST EXITQUIT                  = 600
  17. CONST EXITSUCCESS               = 700
  18. CONST APPHELP                   = 900
  19. CONST ASKFORREBOOT              = 1100
  20. CONST SHOWINSTALLPATH           = 1200
  21. CONST CDSERNB                   = 1300
  22. CONST CDCOMPNAME                = 1400
  23. CONST TOOBIG                    = 6300
  24. CONST BADPATH                   = 6400
  25.  
  26. ''Bitmap ID
  27. CONST LOGO = 1
  28.  
  29. GLOBAL DEST$            ''Default destination directory.
  30. GLOBAL WINDIR$
  31. GLOBAL SYSINI$
  32. GLOBAL CTLINI$
  33. GLOBAL SYSOLD$
  34. GLOBAL CTLOLD$
  35. GLOBAL SAPSUSER$
  36. GLOBAL RestoreIniFlag%
  37.  
  38. GLOBAL WINDRIVE$        ''Windows drive letter.
  39.  
  40. ''CustInst list symbol names
  41. GLOBAL APPNEEDS$        ''Option list costs per drive
  42. GLOBAL EXTRACOSTS$      ''List of extra costs to add per drive
  43. GLOBAL DESTSPACEOK$
  44.  
  45. ''Install Dialog list symbol names
  46. GLOBAL CHECKSTATES$
  47. GLOBAL STATUSTEXT$
  48. GLOBAL DRIVETEXT$
  49.  
  50. DECLARE FUNCTION ShowWindow  LIB "user.exe" (hWnd%,iShow%) AS INTEGER
  51.  
  52. DECLARE SUB InstallFiles
  53. DECLARE SUB UpdateIniFiles
  54. DECLARE SUB RestoreIniFiles
  55.  
  56. DECLARE FUNCTION MakePath (szDir$, szFile$) AS STRING
  57. DECLARE SUB RecalcSpaceNeeded
  58. DECLARE SUB SetDriveStatus
  59.  
  60. INIT:
  61.     hWnd%=HwndFrame()
  62.     j%=ShowWindow(hWnd%,SW_SHOWMAXIMIZED)
  63.  
  64.     SetTitle "SAPS for Windows Server Setup Program"
  65.     SetAbout "SpartaCom Asynchronous Port Sharing","Copyright (c) SpartaCom S.A. 1993-1994"
  66.     CUIDLL$ = "mscuistf.dll"        ''Custom user interface dll
  67.     HELPPROC$ = "FHelpDlgProc"      ''Help dialog procedure
  68.  
  69.     SetBitmap CUIDLL$, LOGO
  70.  
  71.     szInf$ = GetSymbolValue("STF_SRCINFPATH")
  72.     IF szInf$ = "" THEN
  73.         szInf$ = GetSymbolValue("STF_CWDDIR") + "INSTALL.INF"
  74.     END IF
  75.     ReadInfFile szInf$
  76.  
  77.     WINDIR$ = GetWindowsDir()
  78.     WINDRIVE$ = MID$(GetWindowsDir, 1, 1)
  79.     DEST$=WINDRIVE$ + ":\SAPS"
  80.     SYSINI$ = "SYSTEM.INI"
  81.     SYSINIFILE$ = MakePath (WINDIR$,SYSINI$)
  82.     SYSOLD$ = "SYSOLD.INI"
  83.     CTLINI$ = "CONTROL.INI"
  84.     CTLOLD$ = "CTLOLD.INI"
  85.     RestoreIniFlag%=0
  86.  
  87.     ''Install list symbols for FCustinstDlgProc
  88.     CHECKSTATES$ = "CheckItemsState"
  89.     STATUSTEXT$ = "StatusItemsText"
  90.     DRIVETEXT$ = "DriveStatusText"
  91.     FOR i% = 1 TO 7 STEP 1
  92.         AddListItem DRIVETEXT$, ""
  93.     NEXT i%
  94.     ReplaceListItem DRIVETEXT$, 7, DEST$
  95.  
  96.     ''Disk cost list symbols
  97.     APPNEEDS$ = "AppNeeds"
  98.     EXTRACOSTS$ = "ExtraCosts"
  99.     FOR i% = 1 TO 26 STEP 1
  100.         AddListItem EXTRACOSTS$, "0"
  101.     NEXT i%
  102.  
  103. '$IFDEF DEBUG
  104.     i% = SetSizeCheckMode(scmOnIgnore)      '' could use scmOff; def = scmOnFatal
  105.     WinDrive$ = MID$(GetWindowsDir, 1, 1)
  106.     IF IsDriveValid(WinDrive$) = 0 THEN
  107.         i% = DoMsgBox("Le lecteur de Windows ('"+WinDrive$+"') est invalide.", "Diagnostic", MB_TASKMODAL+MB_ICONHAND+MB_OK)
  108.         GOTO QUIT
  109.     END IF
  110. '$ENDIF ''DEBUG
  111.  
  112.  
  113. WELCOME:
  114.     sz$ = UIStartDlg(CUIDLL$, WELCOME, "FInfoDlgProc", APPHELP, HELPPROC$)
  115.     IF sz$ = "CONTINUE" THEN
  116.         UIPop 1
  117.     ELSE
  118.         GOSUB ASKQUIT
  119.         GOTO WELCOME
  120.     END IF
  121.  
  122. SERIALNB:
  123.     
  124.     SetSymbolValue "SAPSIniFile", "SPSRV.INI"
  125.     SetSymbolValue "IsServerInstall", "YES"
  126.  
  127.     sz$ = UIStartDlg(CUIDLL$, CDSERNB, "FSerNbDlgProc", APPHELP, HELPPROC$)
  128.     IF sz$ = "CONTINUE" THEN
  129.         UIPop 1
  130.     ELSE
  131.         GOSUB ASKQUIT
  132.         GOTO SERIALNB
  133.     END IF
  134.  
  135. COMPNAME:
  136.     CompName$ = GetIniKeyString(SYSINIFILE$,"Network","ComputerName")
  137.     IF CompName$ = "" THEN
  138.         sz$ = UIStartDlg(CUIDLL$, CDCOMPNAME, "FCompNameDlgProc", APPHELP, HELPPROC$)
  139.         IF sz$ = "CONTINUE" THEN
  140.             UIPop 1
  141.         ELSE
  142.             GOSUB ASKQUIT
  143.             GOTO COMPNAME
  144.         END IF
  145.     END IF
  146.  
  147. SEARCHDESTPATH:
  148.     WinPath$ = GetWindowsDir()
  149.  
  150.     SPSRV$ = MakePath(WINDIR$, "SPSRV.INI")
  151.     SAPSUSER$ = MakePath(WINDIR$, "SAPSUSER.INI")
  152.     IF DoesIniKeyExist(SAPSRV$, "SERVER", "WorkingDirectory") THEN
  153.         DIRDEST$ = GetIniKeyString(SAPSRV$, "SERVER", "WorkingDirectory")
  154.     IF IsDirWritable(DIRDEST$) THEN
  155.         DEST$=DIRDEST$
  156.         ReplaceListItem DRIVETEXT$, 7, DEST$
  157.     END IF
  158.     ELSEIF DoesIniKeyExist(SAPSUSER$, "SPORTMAN", "WorkingDirectory") THEN
  159.         DIRDEST$ = GetIniKeyString(SAPSUSER$, "SPORTMAN", "WorkingDirectory")
  160.         IF IsDirWritable(DIRDEST$) THEN
  161.             DEST$=DIRDEST$
  162.             ReplaceListItem DRIVETEXT$, 7, DEST$
  163.         END IF
  164.     END IF
  165.  
  166. SHOWINSTALL:
  167.     RecalcSpaceNeeded
  168.     SetDriveStatus
  169.  
  170.     sz$ = UIStartDlg(CUIDLL$, SHOWINSTALLPATH, "FCustInstDlgProc", APPHELP, HELPPROC$)
  171.     IF sz$ = "CONTINUE" THEN
  172.         ''Install only if it will fit.
  173.         IF DESTSPACEOK$ <> "YES" THEN
  174.             GOSUB TOOBIG
  175.             GOTO SHOWINSTALL
  176.         END IF
  177.         UIPop 1
  178.         GOTO INSTALL
  179.     ELSEIF sz$ = "PATH" THEN
  180.         GOSUB GETPATH
  181.         GOTO SHOWINSTALL
  182.  
  183.     ELSEIF sz$ = "BACK" THEN
  184.         UIPop 1
  185.         GOTO SERIALNB
  186.     ELSEIF sz$ = "REACTIVATE" THEN
  187.         RecalcSpaceNeeded
  188.         SetDriveStatus
  189.         GOTO SHOWINSTALL
  190.     ELSE
  191.         GOSUB ASKQUIT
  192.         GOTO SHOWINSTALL
  193.     END IF
  194.  
  195. GETPATH:
  196.     SetSymbolValue "EditTextIn", DEST$
  197.     SetSymbolValue "EditFocus", "END"
  198.  
  199. GETPATHL1:
  200.     sz$ = UIStartDlg(CUIDLL$, DESTPATH, "FEditDlgProc", APPHELP, HELPPROC$)
  201.     IF sz$ = "CONTINUE" THEN
  202.         NEWDEST$ = GetSymbolValue("EditTextOut")
  203.         IF IsDirWritable(NEWDEST$) = 0 THEN
  204.             GOSUB BADPATH
  205.             GOTO GETPATHL1
  206.         END IF
  207.         UIPop 1
  208.         DEST$=NEWDEST$
  209.         ''Truncate display if too long.
  210.         IF LEN(DEST$) > 23 THEN
  211.             ReplaceListItem DRIVETEXT$, 7, MID$(DEST$, 1, 23)+"..."
  212.         ELSE
  213.             ReplaceListItem DRIVETEXT$, 7, DEST$
  214.         END IF
  215.     ELSEIF sz$ = "REACTIVATE" THEN
  216.         RecalcSpaceNeeded
  217.         SetDriveStatus
  218.         GOTO GETPATHL1
  219.     ELSEIF sz$ = "BACK" THEN
  220.         UIPop 1
  221.     ELSE
  222.         GOSUB ASKQUIT
  223.         GOTO GETPATH
  224.     END IF
  225.     RETURN
  226.  
  227. INSTALL:
  228.     InstallFiles
  229.  
  230. QUIT:
  231.     ON ERROR GOTO ERRQUIT
  232.  
  233.     IF ERR = 0 THEN
  234.         dlg% = EXITSUCCESS
  235.     ELSEIF ERR = STFQUIT THEN
  236.         dlg% = EXITQUIT
  237.     ELSE
  238.         dlg% = EXITFAILURE
  239.     END IF
  240.  
  241. QUITL1:
  242.     sz$ = UIStartDlg(CUIDLL$, dlg%, "FInfo0DlgProc", 0, "")
  243.     IF sz$ = "REACTIVATE" THEN
  244.         GOTO QUITL1
  245.     END IF
  246.     UIPop 1
  247.         IF dlg% <> EXITSUCCESS THEN
  248.          '' Installation fails. Restore INI files
  249.         IF RestoreIniFlag% = 1 THEN
  250.             RestoreIniFiles
  251.         END IF
  252.     END IF
  253.  
  254.     END
  255.  
  256. ERRQUIT:
  257.     i% = DoMsgBox("Les fichiers du programme d'installation ont ΘtΘ corrompus, contactez le service de support technique du produit !", "Message du programme d'installation", MB_OK+MB_TASKMODAL+MB_ICONHAND)
  258.     END
  259.  
  260. TOOBIG:
  261.     sz$ = UIStartDlg(CUIDLL$, TOOBIG, "FInfo0DlgProc", 0, "")
  262.     IF sz$ = "REACTIVATE" THEN
  263.         RecalcSpaceNeeded
  264.         SetDriveStatus
  265.         GOTO TOOBIG
  266.     END IF
  267.     UIPop 1
  268.     RETURN
  269.  
  270. BADPATH:
  271.     sz$ = UIStartDlg(CUIDLL$, BADPATH, "FInfo0DlgProc", 0, "")
  272.     IF sz$ = "REACTIVATE" THEN
  273.         GOTO BADPATH
  274.     END IF
  275.     UIPop 1
  276.     RETURN
  277.  
  278. ASKQUIT:
  279.     sz$ = UIStartDlg(CUIDLL$, ASKQUIT, "FQuitDlgProc", 0, "")
  280.     IF sz$ = "EXIT" THEN
  281.         UIPopAll
  282.         ERROR STFQUIT
  283.     ELSEIF sz$ = "REACTIVATE" THEN
  284.         GOTO ASKQUIT
  285.     ELSE
  286.         UIPop 1
  287.     END IF
  288.     RETURN
  289.  
  290. ASKREBOOT:
  291.     sz$ = UIStartDlg(CUIDLL$, ASKFORREBOOT, "FQuitDlgProc", 0, "")
  292.     IF sz$ = "EXIT" THEN
  293.         GOSUB ASKQUIT
  294.         GOTO ASKREBOOT
  295.     ELSEIF sz$ = "REACTIVATE" THEN
  296.         GOTO ASKREBOOT
  297.     ELSE
  298.         UIPop 1
  299.     END IF
  300.     RETURN
  301.  
  302. '**
  303. '** Purpose:
  304. '**      Builds the copy list and performs all installation operations.
  305. '** Arguments:
  306. '**      none.
  307. '** Returns:
  308. '**      none.
  309. '*************************************************************************
  310.  
  311. SUB InstallFiles STATIC
  312.  
  313.     WINDIR$ = GetWindowsDir()
  314.     SYSINI$ = "SYSTEM.INI"
  315.     SYSINIFILE$ = MakePath(WINDIR$, SYSINI$)
  316.     WinSysDir$ = GetWindowsSysDir()
  317.     SrcDir$ = GetSymbolValue("STF_SRCDIR")
  318.     CreateDir DEST$, cmoNone
  319.  
  320.     OpenLogFile MakePath(DEST$, "LOGFILE.OUT"), 0
  321.     WriteToLogFile "SAPS Server Installation"
  322.     WriteToLogFile "-------------------------"
  323.     WriteToLogFile "Destination Path : '" + DEST$ + "'"
  324.     WriteToLogFile ""
  325.     WriteToLogFile ""
  326.  
  327.     ClearCopyList
  328.     AddSectionFilesToCopyList "Files", SrcDir$, DEST$
  329.     AddSectionFilesToCopyList "System_Files", SrcDir$, WinSysDir$
  330.  
  331.     SetRestartDir DEST$
  332.  
  333.     CopyFilesInCopyList
  334.  
  335.     '' Modif RQ 01/08/96 - Delete old CPLSAPS.DLL if found in the system directory
  336.     RemoveFile MakePath(WinSysDir$, "CPLSAPS.DLL"), cmoForce
  337.  
  338.     SPSRV$ = MakePath(WINDIR$, "SPSRV.INI")
  339.     SAPSUSER$ = MakePath(WINDIR$, "SAPSUSER.INI")
  340.     CreateIniKeyValue SPSRV$, "SERVER", "WorkingDirectory", DEST$, cmoOverwrite
  341.     CreateIniKeyValue SPSRV$, "SERVER", "Visible", "1", cmoOverwrite
  342.  
  343.     IF DoesIniSectionExist(SAPSUSER$, "SPORTMAN") THEN
  344.         CreateIniKeyValue SAPSUSER$, "SPORTMAN", "Server", "1", cmoOverwrite
  345.     END IF
  346.  
  347.     CursorSave% = ShowWaitCursor()
  348.     UpdateIniFiles
  349.  
  350.     CreateProgmanGroup "SAPS", "" , cmoNone
  351.     ShowProgmanGroup "SAPS", 1 , cmoNone
  352.     CreateProgmanItem "SAPS", "SAPS Server", MakePath(DEST$, "SPSRV.EXE"), "", cmoOverwrite
  353.     CreateProgmanItem "SAPS", "Server Help", MakePath(WinDir$, "WINHELP.EXE "+MakePath(DEST$, "SPSRV.HLP")), "", cmoOverwrite
  354.     CreateProgmanItem "SAPS", "Info", MakePath(WinDir$, "WRITE.EXE "+MakePath(DEST$, "INFO.WRI")), "", cmoOverwrite
  355.  
  356.     RestoreCursor CursorSave%
  357.  
  358.     CloseLogFile
  359. END SUB
  360.  
  361.  
  362. '**
  363. '** Purpose:
  364. '**      Save .INI files to .OLD and Update .INI files
  365. '** Arguments:
  366. '**      none.
  367. '** Returns:
  368. '**      none.
  369. '*************************************************************************
  370.  
  371. SUB UpdateIniFiles STATIC
  372.  
  373.     WINDIR$ = GetWindowsDir()
  374.     SYSINI$ = "SYSTEM.INI"
  375.     SYSINIFILE$ = MakePath(WINDIR$, SYSINI$)
  376.     WinSysDir$ = GetWindowsSysDir()
  377.     CTLINIFILE$ = MakePath(WINDIR$, CTLINI$)
  378.  
  379.     CopyFile SYSINIFILE$, MakePath(DEST$, SYSOLD$), cmoOverwrite+cmoReadOnly, 0
  380.     CopyFile CTLINIFILE$, MakePath(DEST$, CTLOLD$), cmoOverwrite+cmoReadOnly, 0
  381.     CreateIniKeyValue CTLINIFILE$, "mmcpl", "SAPSServer", MakePath(DEST$, "WRAP16.DLL"), cmoOverwrite
  382.     NETHEAP$ = GetIniKeyString(SYSINIFILE$, "386Enh", "NetHeapsize")
  383.     IF VAL(NETHEAP$) < 28 THEN
  384.         CreateIniKeyValue SYSINIFILE$, "386Enh", "NetHeapSize", "28", cmoOverwrite
  385.     END IF
  386.     IF DoesIniSectionExist(SYSINIFILE$, "Standard") THEN
  387.         NETHEAP$ = GetIniKeyString(SYSINIFILE$, "Standard", "NetHeapSize")
  388.         IF VAL(NETHEAP$) < 28 THEN
  389.             CreateIniKeyValue SYSINIFILE$, "Standard", "NetHeapSize", "28", cmoOverwrite
  390.         END IF
  391.     END IF
  392.     RestoreIniFlag% =1
  393. END SUB
  394.  
  395. '**
  396. '** Purpose:
  397. '**      Restore .INI files to previous contents
  398. '** Arguments:
  399. '**      none.
  400. '** Returns:
  401. '**      none.
  402. '*************************************************************************
  403.  
  404. SUB RestoreIniFiles STATIC
  405.  
  406.     WinSysDir$ = GetWindowsSysDir()
  407.  
  408.     CopyFile MakePath(DEST$, SYSOLD$), MakePath(WINDIR$, SYSINI$), cmoOverwrite, 0
  409.     CopyFile MakePath(DEST$, CTLOLD$), MakePath(WINDIR$, CTLINI$), cmoOverwrite, 0
  410.     RemoveFile MakePath(DEST$, SYSOLD$), cmoForce
  411.     RemoveFile MakePath(DEST$, CTLOLD$), cmoForce
  412.  
  413.     RestoreIniFlag% = 0
  414. END SUB
  415.  
  416. '**
  417. '** Purpose:
  418. '**      Recalculates disk space for the given option files and sets
  419. '**      the status info symbol "StatusItemsText".
  420. '** Arguments:
  421. '**      none
  422. '** Returns:
  423. '**      none.
  424. '*************************************************************************
  425.  
  426. SUB RecalcSpaceNeeded STATIC
  427.  
  428.     CursorSave% = ShowWaitCursor()
  429.     WinSysDir$ = GetWindowsSysDir()
  430.  
  431.     SrcDir$ = GetSymbolValue("STF_SRCDIR")
  432.  
  433.     ClearCopyList
  434.     AddSectionFilesToCopyList "Files", SrcDir$, DEST$
  435.     AddSectionFilesToCopyList "System_Files", SrcDir$, WinSysDir$
  436.  
  437.     dstdrive$ = MID$(DEST$, 1, 1)
  438.     wdrive% = ASC(ucase$(WINDRIVE$)) - ASC("A") + 1
  439.     ndrive% = ASC(ucase$(dstdrive$)) - ASC("A") + 1
  440.  
  441.     cost& = GetSizeOfFile(MakePath(WINDIR$, CTLINI$))
  442.     cost& = cost&+GetSizeOfFile(MakePath(WINDIR$, SYSINI$))
  443.  
  444.     IF dstdrive$ = WINDRIVE$ THEN
  445.         ''Add all extra cost to destination drive
  446.         ReplaceListItem EXTRACOSTS$, ndrive%, STR$(cost&+11264)
  447.     ELSE
  448.         ''Add extra cost to Windows drive for ini/progman, etc.
  449.         ReplaceListItem EXTRACOSTS$, ndrive%, STR$(cost&)
  450.         ReplaceListItem EXTRACOSTS$, wdrive%, "11264"
  451.     END IF
  452.  
  453.     StillNeed& = GetCopyListCost(EXTRACOSTS$, APPNEEDS$, "")
  454.  
  455.     IF StillNeed& > 0 THEN
  456.         DESTSPACEOK$ = "NO"
  457.     ELSE
  458.         DESTSPACEOK$ = "YES"
  459.     END IF
  460.  
  461.     RestoreCursor CursorSave%
  462. END SUB
  463.  
  464. '**
  465. '** Purpose:
  466. '**      Appends a file name to the end of a directory path,
  467. '**      inserting a backslash character as needed.
  468. '** Arguments:
  469. '**      szDir$  - full directory path (with optional ending "\")
  470. '**      szFile$ - filename to append to directory
  471. '** Returns:
  472. '**      Resulting fully qualified path name.
  473. '*************************************************************************
  474.  
  475. FUNCTION MakePath (szDir$, szFile$) STATIC AS STRING
  476.  
  477.     IF szDir$ = "" THEN
  478.         MakePath = szFile$
  479.     ELSEIF szFile$ = "" THEN
  480.         MakePath = szDir$
  481.     ELSEIF MID$(szDir$, LEN(szDir$), 1) = "\" THEN
  482.         MakePath = szDir$ + szFile$
  483.     ELSE
  484.         MakePath = szDir$ + "\" + szFile$
  485.     END IF
  486. END FUNCTION
  487.  
  488.  
  489. '**
  490. '** Purpose:
  491. '**      Sets drive status info according to latest disk space calcs.
  492. '** Arguments:
  493. '**      none.
  494. '** Returns:
  495. '**      none.
  496. '*************************************************************************
  497.  
  498. SUB SetDriveStatus STATIC
  499.  
  500.     drive$ = MID$(DEST$, 1, 1)
  501.     ndrive% = ASC(ucase$(drive$)) - ASC("A") + 1
  502.     cost& = VAL(GetListItem(APPNEEDS$, ndrive%))
  503.     free& = GetFreeSpaceForDrive(drive$)
  504.     ReplaceListItem DRIVETEXT$, 1, drive$ + ":"
  505.     ReplaceListItem DRIVETEXT$, 2, STR$(cost& / 1024) + " Kb"
  506.     ReplaceListItem DRIVETEXT$, 3, STR$(free& / 1024) + " Kb"
  507.  
  508.     IF drive$ = WINDRIVE$ THEN
  509.         ReplaceListItem DRIVETEXT$, 4, ""
  510.         ReplaceListItem DRIVETEXT$, 5, ""
  511.         ReplaceListItem DRIVETEXT$, 6, ""
  512.     ELSE
  513.         ndrive% = ASC(ucase$(WINDRIVE$)) - ASC("A") + 1
  514.         cost& = VAL(GetListItem(APPNEEDS$, ndrive%))
  515.         IF cost& = 0 THEN
  516.             ReplaceListItem DRIVETEXT$, 4, ""
  517.             ReplaceListItem DRIVETEXT$, 5, ""
  518.             ReplaceListItem DRIVETEXT$, 6, ""
  519.         ELSE
  520.             free& = GetFreeSpaceForDrive(WINDRIVE$)
  521.             ReplaceListItem DRIVETEXT$, 4, WINDRIVE$ + ":"
  522.             ReplaceListItem DRIVETEXT$, 5, STR$(cost& / 1024) + " Kb"
  523.             ReplaceListItem DRIVETEXT$, 6, STR$(free& / 1024) + " Kb"
  524.         END IF
  525.     END IF
  526. END SUB
  527.